#pragma once
#include<unistd.h>
#include<string>
#include<signal.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
//默认更改到根目录
const std::string defaultpath = "/";
//默认重定向到/dev/null文件
const std::string defaultfile = "/dev/null";


void Daemon(bool isclose,const std::string& path = defaultpath)
{
    //忽略守护进程经常忽略的信号
    signal(SIGPIPE,SIG_IGN);
    signal(SIGCHLD,SIG_IGN);

    //setsid调用的进程不能是进程组组长
    if(fork() > 0) exit(0);//创建子进程，父进程退出

    //让子进程调用，成为守护进程
    setsid();

    //是否关闭012
    if(isclose)
    {
        ::close(0);
        ::close(1);
        ::close(2);
    }
    else
    {
        int fd = ::open(defaultfile.c_str(),O_RDWR);
        if(fd > 0)
        {
            dup2(fd,0);
            dup2(fd,1);
            dup2(fd,2);
        }
        ::close(fd);
    }
}